class Questao < ActiveRecord::Base
  has_many :alternativas, :conditions => {:ativo => 1}
  has_and_belongs_to_many :tags
  
  attr_writer :tags_nome
  after_save :setar_tags, :salvar_alternativas
  
  validates_presence_of :descricao
  validates_associated :alternativas
  
  def self.find_tagged_with(tags = [])
    find_by_sql(" SELECT 
                    q.* 
                  FROM 
                    questoes_tags qt
                    join questoes q on q.id = qt.questao_id
                    join tags t on t.id = qt.tag_id
                  WHERE 
                    t.nome #{sanitize_sql_array(["IN (?)", tags])}
                  GROUP BY 
                    q.id
                  HAVING 
                    COUNT(q.id) = #{tags.length}")
  end
  
  def nova_alternativa_atributos=(alternativa_atributos)
    alternativa_atributos.each do |atributos|
      alternativas.build(atributos)
    end
  end
  
  def existente_alternativa_atributos=(alternativa_atributos)
    self.alternativas.reject(&:new_record?).each do |alternativa|
      atributos = alternativa_atributos[alternativa.id.to_s]
      if atributos
        alternativa.attributes = atributos
      else
        alternativa.ativo = 0
      end
    end
  end
  
  def salvar_alternativas
    alternativas.each do |alternativa|
      alternativa.save(false)
    end
  end
  
  def tags_nome
    @tag_nomes || tags.map(&:nome).join(' ')
  end
  
  def setar_tags
    self.tags = @tags_nome.split(/\s+/).map do |nome|
      Tag.find_or_create_by_nome(nome)
    end
  end
  
end